﻿package com.csd.excelreader;

import java.util.*;

public class ExcelFormatChecker 
{
	/*
	 * 约束队列
	 */
	protected Vector< CellConfigInfo > restriction;

	/**
	 * 构造函数
	 * 初始化了约束队列
	 */
	public ExcelFormatChecker ()
	{
		restriction = null;
	}
	
	/**
	 * 方法 loadRestriction
	 * 装入约束队列,就是为约束队列添加约束(即 单元格配置信息)
	 * @return 加载成功与否
	 */
	public boolean loadRestriction ()
	{
		return false;
	}
	
	/**
	 * @param restriction the restriction to set
	 */
	public void setRestriction(Vector<CellConfigInfo> restriction) {
		this.restriction = restriction;
	}
	

	/**
	 * @return the restriction
	 */
	public Vector<CellConfigInfo> getRestriction() {
		return restriction;
	}

	/**
	 * 方法 checkRow
	 * 做行检查，对于一个给定的 reader ，对它的当前行作检查
	 * 检查依据来自已经加载的约束队列
	 * @param reader
	 * @return 检查结果
	 */
	public boolean checkRow ( ExcelReaderDriver reader )
	{
		boolean result = true;
		CellConfigInfo cellConfig = null;
		
		if (this.restriction == null )
		{
			return false;
		}
		
		for ( Iterator<CellConfigInfo> i = this.restriction.iterator(); 
			i.hasNext () && result; )
		{
			cellConfig = i.next();

			//System.out.println ( cellConfig.getClumIndex() );
			switch ( cellConfig.getCellType () )
			{
			case CellConfigInfo.CELL_TYPE_NUM:
				result = this.checkNumCell ( ( NumCellConfigInfo ) cellConfig, reader);
				break;
			case CellConfigInfo.CELL_TYPE_STR:
				result = this.checkStrCell ( ( StringCellConfig ) cellConfig, reader);
				if (!result)
					System.out.println("false cell: "+ ((StringCellConfig)cellConfig).getClumIndex()+1);
				break;
			case CellConfigInfo.CELL_TYPE_DATE:
				result = this.checkDateCell ( ( DateCellConfigInfo ) cellConfig, reader );
				if (!result)
					System.out.println("false cell: "+ ((StringCellConfig)cellConfig).getClumIndex()+1);
				break;
			case CellConfigInfo.CELL_TYPE_BOOL:
				result = this.checkBoolCell ( cellConfig, reader );
				break;
			default:
				result = this.checkRightCell( cellConfig, reader );
				break;
			}
		
		}		
		return result;
	}
	
	/*
	 * 方法 checkNumCell
	 * 检查一个给定的 reader 的单元格，若认确定它是数字类型
	 * 检查依据由 cellConfig 指定
	 * @param cellConfig 指定检查依据
	 * @param reader 指定被检查者
	 * @return 检查结果：合法与否
	 */
	private boolean checkNumCell ( NumCellConfigInfo cellConfig, ExcelReaderDriver reader )
	{
		if (  reader.checkFormatForEmpty ( cellConfig.getClumIndex() ) )
		{
			if ( cellConfig.isEmptyEnable() )
				return true;
			else
				return false;
		}
		
		return reader.checkFormatForNumeric (
				cellConfig.getClumIndex (), 
				cellConfig.getUpperLimit (), 
				cellConfig.getLowerLimit (), 
				cellConfig.isFloatEnable ()
				);
	}
	
	/*
	 * 方法 checkStrCell
	 * 检查一个给定的 reader 的单元格，若认定它是字符串类型
	 * 检查依据由 cellConfig 指定
	 * @param cellConfig 指定检查依据
	 * @param reader 指定被检查者
	 * @return 检查结果：合法与否
	 */
	private boolean checkStrCell ( StringCellConfig cellConfig, ExcelReaderDriver reader )
	{
		if (  reader.checkFormatForEmpty ( cellConfig.getClumIndex() ) )
		{
			if ( cellConfig.isEmptyEnable() )
			{
				return true;
			}
			else
			{
				return false;
			}
		}
		
		return reader.checkFormatForString (
				cellConfig.getClumIndex (), 
				cellConfig.getUpperLimit (), 
				cellConfig.getLowerLimit ()
				);
	}
	
	/*
	 * 方法 checkDateCell
	 * 检查一个给定的 reader 的单元格，若认定它是日期类型
	 * 检查依据由 cellConfig 指定
	 * @param cellConfig 指定检查依据
	 * @param reader 指定被检查者
	 * @return 检查结果：合法与否
	 */
	private boolean checkDateCell ( DateCellConfigInfo cellConfig, ExcelReaderDriver reader )
	{
		if (  reader.checkFormatForEmpty ( cellConfig.getClumIndex() ) )
		{
			if ( cellConfig.isEmptyEnable() )
				return true;
			else
				return false;
		}
		
		return reader.checkFormatForDate (
				cellConfig.getClumIndex (), 
				cellConfig.getUpperLimit (), 
				cellConfig.getLowerLimit ()
				);
	}
	
	/*
	 * 方法 checkBoolCell
	 * 检查一个给定的 reader 的单元格，若认定它是布尔类型
	 * 检查依据由 cellConfig 指定
	 * @param cellConfig 指定检查依据
	 * @param reader 指定被检查者
	 * @return 检查结果：合法与否
	 */
	private boolean checkBoolCell ( CellConfigInfo cellConfig, ExcelReaderDriver reader )
	{
		if (  reader.checkFormatForEmpty ( cellConfig.getClumIndex() ) )
		{
			if ( cellConfig.isEmptyEnable() )
				return true;
			else
				return false;
		}
		
		return reader.checkFormatForBoolean( cellConfig.getClumIndex () );
	}
	
	/*
	 * 方法 checkEmptyCell
	 * 检查一个给定的 reader 的单元格，若没有特殊限定
	 * 检查依据由 cellConfig 指定
	 * 认为只要非空即为合法，如果允许为空则空值也合法
	 * 也就是只有在不允许为空但是确实空值的时候才不合法
	 * @param cellConfig 指定检查依据
	 * @param reader 指定被检查者
	 * @return 检查结果是否是合要求
	 */
	private boolean checkRightCell ( CellConfigInfo cellConfig, ExcelReaderDriver reader )
	{
		if (  reader.checkFormatForEmpty ( cellConfig.getClumIndex() ) )
		{
			if ( cellConfig.isEmptyEnable() )
				return true;
			else
				return false;
		}
		return true;
	}
}
